#include <iostream>
#include <cstring>
#include <tporo.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

/** \file tporo.cpp
* \brief Procedimientos de la clase TPoro.
*
* STANISLAV LITVINENKO DNI:02062226T
* JOSÉ FRANCÉS IRIONDO DNI:48469642V
*/

char* TPoro::toLower(char *cadena)
{

	char *c=NULL;
	int top;
	int i=0;
	
	string aux;


	if (cadena != NULL)
	{
		top = strlen(cadena);
		//c = (char *) malloc((top + 1) * sizeof(char *));
                //char c[top+1];
 		c = new char[top+1];
 		//c = strdup(cadena+1);
		if (c != NULL)
		{
			while (i < top)
			{
				if ((cadena[i] >= 'A') && (cadena[i] <= 'Z'))
					c[i] = (cadena[i] + 32);
				else
					c[i] = cadena[i];
 
				i++;
			}

			c[i] = '\0';
		}
	}
aux=c;
//delete[] c;
//c=NULL;
return c;
}

TPoro::TPoro() {

	x = 0; 
	y = 0; 
	volumen = 0.0;
	color = NULL;
}

TPoro::TPoro(int px, int py, double pvol) {
	x=px;
	y=py;
	volumen=pvol;
	color = NULL;
}

TPoro::TPoro(int px, int py, double pvol, char* pcolor) {
	

	if(pcolor == NULL)
	{
		color=NULL;
	}
	else
	{
		//color = new char[strlen(pcolor)+1];
		/*color = strdup(pcolor+1);
		for(int i=0; i < strlen(pcolor);i++)
		{
			color[i]=tolower(pcolor[i]);
		}*/
		
		color=toLower(pcolor);
	}

	x=px;
	y=py;
	volumen=pvol;
        pcolor=NULL;
}

TPoro::TPoro(const TPoro & poro) {

	int i,longitud;
	
	if(poro.color == NULL)
	{
		this->color=NULL;
	}
	else
	{
		this->color=toLower(poro.color);
	}	
	this->x = poro.x;
	this->y = poro.y;
	this->volumen = poro.volumen;

}

TPoro::~TPoro() {
	x = y = 0;
	volumen = 0.0;
        
	color = NULL;
}

TPoro&
TPoro::operator= (const TPoro & poro) {
	
	char *a;
	int i,longitud;

	if(this != &poro)
	{

	
		if(poro.color == NULL)
		{
			this->color=NULL;
		}
		else
		{
			this->color=poro.color;
		}	
		this->x = poro.x;
		this->y = poro.y;
		this->volumen = poro.volumen;
	}

	return *this;
}

bool
TPoro::operator== (const TPoro & poro) const {


	if(poro.x == this->x && poro.y == this->y && poro.volumen == this->volumen)
	{
		if(this->color==NULL && poro.color==NULL)
		{
			return true;
		}
		else if((this->color==NULL && poro.color!=NULL) || (poro.color==NULL && poro.color!=NULL))
		{
			return false;
		}
		else if(strcmp(this->color,poro.color)==0)
		{
			return true;
		}
	}
	else
	{
		return false;
	}
}

bool
TPoro::operator!= (const TPoro & poro) const {

	if(poro.x == this->x && poro.y == this->y && poro.volumen == this->volumen)
	{
		if(this->color==NULL && poro.color==NULL)
		{
			return false;
		}
		else if((this->color==NULL && poro.color!=NULL) || (poro.color==NULL && poro.color!=NULL))
		{
			return true;
		}
		else if(strcmp(this->color,poro.color)==0)
		{
			return false;
		}
	}
	else
	{
		return true;
	}
}

void
TPoro::Posicion(int px, int py) {
  this->x = px;
  this->y = py;
}

void
TPoro::Volumen(double pvolumen) {
  this->volumen = pvolumen;
}

void
TPoro::Color(char * pcolor) {

	
	if(pcolor == NULL)
	{
		color=NULL;
	}
	else
	{
		color=toLower(pcolor);	
	}	
}

int
TPoro::PosicionX() const{
	return this->x;
}

int
TPoro::PosicionY() const{
	return this->y;
}

double
TPoro::Volumen() const{
	return this->volumen;
}

char *
TPoro::Color() const{
	return this->color;
}

bool
TPoro::EsVacio() const{
	return (x == 0 && y == 0 && volumen == 0.0 && color == NULL);
}

ostream&
operator<< (ostream &os, const TPoro &poro) {
	
	cout.setf(ios::fixed);
	cout.precision(2);
	
	os << '(';
	if(poro.EsVacio())
	{
		os << ')';
	}
	else
	{
		os << poro.PosicionX() << ',' << ' ' << poro.PosicionY() << ')' << ' ' << poro.Volumen() << ' ';
    
		if(poro.Color() == NULL)
		{ 
			os << '-';
		}
		else
		{
			os << poro.Color();
		}
	}
}
